package com.robert.BCH;

import java.util.ArrayList;
import java.util.List;

public class alpha {
    /**
     * 设置好参数需要计算alpha和分圆陪集cyclotomic
     * 计算alpha和cyclotomic并不干扰
     * alpha是GF(2^m)有限域上的元素，在这里遍历所有的元素，以及元素幂次与值的离散索引关系
     * 下面是alpha相关的函数和参数
     */
    //F(2^m)有限域上的元素
    private int[][] value;
    //用于反向读取alpha的次数，例对\alpha^7=1011，若已知1011，转成10进制为11，则indexes[11]=7
    private int[] indexes;

    public int[][] getValue() {
        return value;
    }

    public int[] getIndexes() {
        return indexes;
    }

    //计算F(2^m)有限域上的元素
    private void computeValues(parameters p){
        polynomial a = new polynomial("10");
        polynomial x = new polynomial("10");
        int lg = p.getG().getDeg();
        value = new int[p.getN()][lg];
        value[0][lg-2] = 1;
        for(int k=1;k<p.getN();k++){
            x = x.multiply(a);
            //每次更新都都要模生成元
            polynomial tx = x.mod(p.getG());
            value[k] = tx.extend(lg-1-tx.getDeg());
        }
    }

    //计算F(2^m)有限域上元素的幂次与值的离散索引关系
    private void computeIndexes(){
        indexes = new int[value.length];
        List<Integer> tIndex = new ArrayList<>();
        for (int[] tv : value) {
            //转十进制
            int dec = 0;
            for (int k : tv) {
                dec <<= 1;
                if (k == 1) dec += 1;
            }
            tIndex.add(dec);
        }
        //反读列表
        for(int i=0;i<value.length;i++){
            indexes[tIndex.get(i)-1] = i+1;
        }
    }

    //后期上面两个函数编程private之后
    public void computeAlpha(parameters p){
        computeValues(p);
        computeIndexes();
    }
}
